Dominar o ciclo de vida de um objeto C++ é comandar os próprios mecanismos da existência no heap e pilha. O controle de cópia define como uma classe gerencia seu tempo de vida através de duas operações: o construtor de cópia e o operador de atribuição por cópia.
1. Inicialização versus Atribuição
Inicialização direta (por exemplo, string dots(10, '.')) invoca um construtor diretamente. No entanto, inicialização por cópia (string s2 = dots) depende do construtor de cópia. Diferentemente da inicialização, atribuição (trans = acum) sobrescreve um objeto existente usando operador=. Uma restrição crítica: o parâmetro do construtor de cópia deve ser uma referência (const Foo&); caso contrário, passar um argumento por valor acionaria um loop recursivo infinito de chamadas de cópia.
2. O Papel da Síntese
Se você não definir esses membros, o compilador fornece versões sintetizadas que realizam cópias por membro. Cuidado: embora sejam suficientes para tipos simples, frequentemente falham em classes que gerenciam memória dinâmica, levando a ponteiros pendurados ou liberações duplicadas.